/* 
 * File:   EstruturaEquivalente.cpp
 * Author: User007
 * 
 * Created on August 12, 2011, 10:48 PM
 */

#include "EstruturaEquivalente.h"
#include <stdio.h>
#include "utilMat.h"
#include "Label_Struct.h"

EstruturaEquivalente::EstruturaEquivalente() {
}

EstruturaEquivalente::EstruturaEquivalente(const EstruturaEquivalente& orig) {
}

EstruturaEquivalente::~EstruturaEquivalente() {
}

void EstruturaEquivalente::add(int label, int pai) {
    
    bool existe = false;
        int posicao = -1;
        int novoPai;

        //Verifica se ja existe o filho
        for (int i = 0; i < estrutura.size; i++) {           
            if (estrutura.get(i).label == label) {
                posicao = i;
                existe = true;
                break;
            }
        }

        //Verifica se o pai adicionado ja é filho de algum no
        for (int i = 0; i < estrutura.size; i++) {
            //Se o pai ja for filho de outro no
            //Faça o pai desse outro no ser pai tbm do novo no adicionado
            if (estrutura.get(i).label == pai && existe == false) {
                label_struct pf;
                pf.label = label;
                pf.pai = estrutura.get(i).pai;               
                estrutura.add(pf);
                posicao = estrutura.size-1;
                existe = true;
                break;
            }
        }
        //Se nao existe add
        if (existe == false) {
            label_struct pf;
            pf.label = label;
            pf.pai = pai;
            estrutura.add(pf);
        }//Se existir adiciona o menor pai 
    else {
        novoPai = Min(pai, estrutura.get(posicao).pai);
        estrutura.get(posicao).pai = novoPai;
        //Verifica se o pai adicionado ja é filho de algum no
        for (int i = 0; i < estrutura.size; i++) {
            //Se o pai ja for filho de outro no
            //Faça o pai desse outro no ser pai tbm do novo no adicionado
            if (estrutura.get(i).label == novoPai) {
                novoPai = estrutura.get(i).pai;
                estrutura.get(posicao).pai = novoPai;
                break;
            }
        }
    }
}

int EstruturaEquivalente::GetPai(int label) {
    int pai = label;
    //Procura pelo pai na estrutura
    for (int i = 0; i < estrutura.size; i++) {
        //Se achar, retorne o pai
        if (estrutura.get(i).label == label) {
            pai = estrutura.get(i).pai;
        }
    }
    //Se nao achar retorne ele mesmo
    return pai;
}
